/**
 * 模拟 react setState
 * @param {Function} anyMethod 需要执行的方法
 * @param {Array} wrappers 执行指定方法前后执行的操作
 */
function perform(anyMethod, wrappers) {
  // 返回函数的目的是不希望调用这个函数就直接触发，而且复制给一个变量，去调用变量
  return function () {
    wrappers.forEach(wrapper => wrapper.initialize())
    anyMethod()
    wrappers.forEach(wrapper => wrapper.close())
  }
}

let newFn = perform(() => {
  console.log('目标方法')
}, [{
  initialize() {
    console.log('wrapper1 beforeSay')
  }, close() {
    console.log('wrapper1 afterSay')
  }
}, {
  initialize() {
    console.log('wrapper2 beforeSay')
  }, close() {
    console.log('wrapper2 afterSay')
  }
}])

newFn()